# pytest 全局测试环境配置，标准化所有测试用例的依赖
import pytest
from flask import Flask
import os, sys, pathlib
import tempfile

# 确保项目根目录加入 sys.path，避免 CI/部分环境下找不到 backend 包
PROJECT_ROOT = pathlib.Path(__file__).resolve().parent.parent
if str(PROJECT_ROOT) not in sys.path:
    sys.path.insert(0, str(PROJECT_ROOT))

from backend.infrastructure.database import db
from backend.models.user import User  # noqa: E402
from backend import create_app  # noqa: E402

@pytest.fixture(scope='session')
def app():
    """创建测试应用，使用独立的SQLite内存数据库，完全隔离开发数据库"""
    # 创建临时测试数据库
    test_db_path = os.path.join(tempfile.gettempdir(), 'test_vision_health.db')
    
    # 强制设置测试环境变量
    os.environ['FLASK_ENV'] = 'testing'
    os.environ['TESTING'] = 'True'
    
    app = create_app()
    
    # 强制覆盖数据库配置为SQLite，确保不会连接MySQL
    app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{test_db_path}'
    app.config['TESTING'] = True
    app.config['WTF_CSRF_ENABLED'] = False
    
    print(f"测试数据库路径: {app.config['SQLALCHEMY_DATABASE_URI']}")
    
    with app.app_context():
        # 为测试创建所有表
        db.create_all()
        yield app
        # 测试结束后清理SQLite测试数据库（安全的，不会影响MySQL）
        db.drop_all()
        # 删除临时测试数据库文件
        if os.path.exists(test_db_path):
            os.remove(test_db_path)

@pytest.fixture()
def client(app):
    return app.test_client()


@pytest.fixture()
def db_session(app):
    with app.app_context():
        yield db.session

# 标准化管理员用户fixture，供所有测试用例依赖
@pytest.fixture()
def admin_user(app):
    """在测试数据库中创建管理员用户"""
    with app.app_context():
        # 先检查是否存在
        admin = User.query.filter_by(username='admin').first()
        if not admin:
            # 创建管理员用户，使用正确的多角色模式
            from backend.models.role import Role
            
            # 确保admin角色存在
            admin_role = Role.query.filter_by(name='admin').first()
            if not admin_role:
                admin_role = Role(name='admin', description='系统管理员')
                db.session.add(admin_role)
                db.session.commit()
            
            # 创建管理员用户
            admin = User(username='admin', real_name='系统管理员')
            admin.password = 'admin123'  # 与测试用例一致
            admin.roles.append(admin_role)  # 使用多对多关系
            db.session.add(admin)
            db.session.commit()
            
        return admin
